/*
 * @Author: bug巫师 184179023@qq.com
 * @Date: 2025-03-01 22:31:19
 * @LastEditors: bug巫师 184179023@.com
 * @LastEditTime: 2025-03-18 10:28:56
 * @FilePath: \abs.oa\cloudfunctions\mcloud\project\oa\service\base_project_service.js
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
/**
 * Notes: 业务基类 
 * Date: 2021-03-15 04:00:00 
 */

const dbUtil = require('../../../framework/database/db_util.js');
const util = require('../../../framework/helpers/util.js');
const AdminModel = require('../../../config/models_config').admin_model;
const BaseService = require('../../../framework/platform/service/base_service.js');
const NewsModel = require('../model/news_model.js');

class BaseProjectService extends BaseService {
	getProjectId() {
		return 'oa';
	}

	/**
	 * 通用列表获取方法
	 * @param {string} collection 集合名
	 * @param {object} filter 过滤条件
	 * @param {object} options 选项参数
	 * @returns {Promise<object>} 列表数据
	 */
	async getList(collection, filter, options = {}) {
		try {
			const collectionName = collection; // 不再添加bx_前缀
			console.log(`[getList] 查询集合: ${collectionName}, 条件:`, JSON.stringify(filter));
			
			// 检查集合是否存在
			const collectionExists = await dbUtil.isExistCollection(collectionName);
			if (!collectionExists) {
				console.error(`[getList] 集合不存在: ${collectionName}`);
				// 尝试创建集合
				try {
					console.log(`[getList] 尝试创建集合: ${collectionName}`);
					await dbUtil.createCollection(collectionName);
				} catch (createErr) {
					console.error(`[getList] 创建集合失败: ${collectionName}`, createErr);
					return { total: 0, list: [] };
				}
			}
			
			// 默认参数
			const page = options.page || 1;
			const size = options.size || 10;
			const isTotal = options.isTotal !== false;
			const orderBy = options.orderBy || { ADD_TIME: 'desc' };
			
			// 计算分页
			const offset = (page - 1) * size;
			
			console.log(`[getList] 查询参数: page=${page}, size=${size}, offset=${offset}`);
			console.log(`[getList] 排序条件:`, JSON.stringify(orderBy));
			
			// 获取总数
			let total = 0;
			if (isTotal) {
				try {
					total = await dbUtil.count(collectionName, filter);
					console.log(`[getList] 总记录数: ${total}`);
				} catch (countErr) {
					console.error(`[getList] 获取总数失败:`, countErr);
					total = 0;
				}
			}
			
			// 获取列表
			let list = [];
			try {
				list = await dbUtil.getAll(collectionName, filter, orderBy, offset, size);
				console.log(`[getList] 查询结果记录数: ${list.length}`);
			} catch (getAllErr) {
				console.error(`[getList] 获取列表失败:`, getAllErr);
				list = [];
			}
			
			return {
				total,
				list
			};
		} catch (err) {
			console.error('[getList] 查询失败:', err);
			return {
				total: 0,
				list: []
			};
		}
	}

	async initSetup() { 
		let F = (c) => c; // 不再添加bx_前缀
		const INSTALL_CL = 'setup_oa';
		const COLLECTIONS = ['oa_setup', 'oa_admin', 'oa_log', 'oa_white', 'oa_news', 'oa_fav', 'oa_user', 'oa_flow', 'oa_project', 'oa_task', 'oa_dynamic', 'research_project'];
		const CONST_PIC = '/images/cover.gif';

		const NEWS_CATE = '1=通知公告';

		let isInstalled = await dbUtil.isExistCollection(F(INSTALL_CL));
		console.log('### initSetup... isInstalled=' + isInstalled);

		// 检查并创建所有集合
		let arr = COLLECTIONS;
		for (let k = 0; k < arr.length; k++) {
			try {
				if (!await dbUtil.isExistCollection(F(arr[k]))) {
					console.log(`创建集合: ${F(arr[k])}`);
					await dbUtil.createCollection(F(arr[k]));
				} else {
					console.log(`集合已存在: ${F(arr[k])}`);
				}
			} catch (err) {
				console.error(`创建集合 ${F(arr[k])} 失败:`, err);
			}
		}

		// 特别检查研发项目集合
		try {
			if (!await dbUtil.isExistCollection(F('research_project'))) {
				console.log('创建研发项目集合');
				await dbUtil.createCollection(F('research_project'));
			} else {
				console.log('研发项目集合已存在');
			}
		} catch (err) {
			console.error('创建研发项目集合失败:', err);
		}

		// 创建并验证管理员账号
		try {
			// 确保admin集合存在
			if (!await dbUtil.isExistCollection(F('oa_admin'))) {
				console.log('创建管理员集合');
				await dbUtil.createCollection(F('oa_admin'));
			}
			
			// 检查是否已存在管理员账号
			const cloudBase = require('../../../framework/cloud/cloud_base.js');
			const db = cloudBase.getCloud().database();
			const adminColl = db.collection('oa_admin');
			
			const countResult = await adminColl.where({
				ADMIN_STATUS: 1 // 只计算启用状态的管理员
			}).count();
			
			console.log('已有管理员账号数量:', countResult.total);
			
			// 如果没有启用状态的管理员，创建一个默认管理员
			if (countResult.total === 0) {
				console.log('创建默认管理员账号');
				
				// 创建管理员数据
				let adminData = {
					ADMIN_NAME: 'admin',
					ADMIN_PASSWORD: 'e10adc3949ba59abbe56e057f20f883e', // 123456的MD5
					ADMIN_DESC: '超级管理员',
					ADMIN_TYPE: 1, // 超级管理员类型
					ADMIN_STATUS: 1, // 启用状态
					ADMIN_ADD_TIME: Math.floor(Date.now() / 1000),
					ADMIN_EDIT_TIME: Math.floor(Date.now() / 1000),
					ADMIN_LOGIN_CNT: 0
				};
				
				// 先尝试删除所有停用状态的管理员
				try {
					const deleteResult = await adminColl.where({
						ADMIN_STATUS: 0
					}).remove();
					console.log('清理停用管理员账号:', deleteResult);
				} catch (deleteErr) {
					console.error('清理停用管理员失败:', deleteErr);
				}
				
				// 使用云数据库API直接添加，避免各种模型兼容性问题
				try {
					const addResult = await adminColl.add({
						data: adminData
					});
					console.log('管理员账号创建成功, ID:', addResult._id);
					
					// 验证创建是否成功
					const checkAdmin = await adminColl.doc(addResult._id).get();
					if (checkAdmin && checkAdmin.data) {
						console.log('管理员账号验证成功:', checkAdmin.data.ADMIN_NAME);
					} else {
						console.error('管理员账号验证失败');
					}
				} catch (addErr) {
					console.error('添加管理员失败，尝试备用方法:', addErr);
					
					// 备用方法：使用dbUtil直接插入
					try {
						const backupResult = await dbUtil.insertOne('oa_admin', adminData);
						console.log('备用方法创建管理员成功, ID:', backupResult);
					} catch (backupErr) {
						console.error('备用方法创建管理员失败:', backupErr);
						// 最后尝试：原始方法
						if (AdminModel) {
							try {
								console.log('使用AdminModel尝试创建管理员');
								await AdminModel.insert(adminData);
								console.log('AdminModel创建管理员成功');
							} catch (modelErr) {
								console.error('AdminModel创建管理员失败:', modelErr);
							}
						}
					}
				}
			} else {
				// 检查已有管理员账号是否可用
				console.log('验证已存在的管理员账号');
				const adminList = await adminColl.where({
					ADMIN_STATUS: 1
				}).get();
				
				if (adminList && adminList.data && adminList.data.length > 0) {
					console.log('已有可用管理员账号:', adminList.data.length);
					console.log('管理员账号示例:', {
						name: adminList.data[0].ADMIN_NAME,
						type: adminList.data[0].ADMIN_TYPE,
						status: adminList.data[0].ADMIN_STATUS
					});
				} else {
					console.warn('奇怪的情况：count显示有管理员，但查询结果为空');
				}
			}
		} catch (adminErr) {
			console.error('处理管理员账号时出错:', adminErr);
		}

		// 如果已经初始化过，直接返回
		if (isInstalled) {
			return;
		}

		if (await dbUtil.isExistCollection(F('oa_news'))) {
			let newsCnt = await NewsModel.count({});
			if (newsCnt == 0) {
				let newsArr = NEWS_CATE.split(',');
				for (let j in newsArr) {
					let title = newsArr[j].split('=')[1];
					let cateId = newsArr[j].split('=')[0];

					let data = {};
					data.NEWS_TITLE = title + '标题1';
					data.NEWS_DESC = title + '简介1';
					data.NEWS_CATE_ID = cateId;
					data.NEWS_CATE_NAME = title;
					data.NEWS_CONTENT = [{ type: 'text', val: title + '内容1' }];
					data.NEWS_PIC = [CONST_PIC];

					await NewsModel.insert(data);
				}
			}
		}

		if (!await dbUtil.isExistCollection(F(INSTALL_CL))) {
			await dbUtil.createCollection(F(INSTALL_CL));
		}
	}

}

module.exports = BaseProjectService;